#pragma once
#include "mono/pch.h"
#include "mono/Clazz.h"
#include "mono/Behivor.h"
#include "mono/Custom.h"

namespace mono
{
    struct System
    {
        std::string m_Name;

        MonoDomain *domain;

        std::map<std::string, std::shared_ptr<Behivor>> m_Behivors;

        bool m_Available;

        System(const std::string &name)
            : m_Name(name)
        {

            m_Available = Init();
        };
        bool Init()
        {
            mono_config_parse(NULL);
            domain = mono_jit_init(m_Name.c_str());

            if (!domain)
            {
                return false;
            }
            return true;
        }

        std::shared_ptr<Behivor> GetCS(const std::string &path)
        {
            return m_Behivors[path];
        }
        bool LoadCS(const std::string &csPath)
        {

            auto inst = std::make_shared<Behivor>(csPath);

            if (inst->m_Available)
            {
                m_Behivors[csPath] = inst;
            }
            else
            {
                ztclog::info("failed init behivor");
            }
            return inst->m_Available;
        };
        ~System()
        {
            mono_jit_cleanup(domain);
        }
    };
}